import tensorflow as tf
import numpy as np


"""
索引的基本格式：
a[d1][d2][d3]
创建一个4位的tensor 其中包含4张图片 每张图片的大小是100*100*3 
NHWC，NCHW 为两种数据格式

N 表示张量当中包含的数据的数量，样本数量
H 表示高
W 宽
C 张量维度

NCHW 基于GPU加速的时候更快
"""

# 创建一个张量 其含义是，4张100*100的3通道图片
tensor_h = tf.random.normal([4, 100, 100, 3])

""" 比如说取出第一张图片的第二个通道中在[20,40]位置的像素点 """

tensor_h[0][20][40][1]

""" 
如果要提取的索引不连续的话，那么就要使用tf.gather和tf.gather_np
在某一维度进行索引 tf.gather(params,indices,axis=None)
params 输入张量
indices 取出数值的索引
axis 所取数据掉在的维度

例子
tensor_h [4, 100, 100, 3]
维度层面   0   1    2   3
"""

# 取出tensor_h中第1，2，4 张图像
indices = [0,1,3]
tf.gather(tensor_h,axis=0,indices=indices,batch_dims=1)

""" 
tf.gather_nd 允许在多维上进行索引：tf.gather_nd(params,indices) 
params: 输入张量
indices: 取出数据的索引，一般为多维列表
"""

indices2 = [[0,1,1,0],[1,2,2,0]]
# 返回结果是个list
tf.gather(tensor_h,indices2)

"""
切片
[start:end]从张量开始位置到结束位置的切片
[start:end:step]或者[::step]从开始到结束每隔step的数据切片
[::-1] 倒叙切片
... 表示任意长
"""
# 取出第一张图片,的所有内容
tensor_h[0,:,:,:]

# 没两张图片取出一张切片
tensor_h[::2,...]


